\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{graphicx}
\usepackage{verbatim}
\usepackage{moreverb}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{fancybox}
\usepackage{float}
\usepackage{fancyvrb}
\usepackage{color}
\usepackage{hyperref}
\usepackage{multirow}

\usepackage{anysize}
\marginsize{0.5cm}{0.5cm}{0cm}{0cm}

\renewcommand{\shorthandsspanish}{}

\newcommand{\HRule}{\rule{\linewidth}{0.5mm}}

\begin{document}

\thispagestyle{empty}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PORTADA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{titlepage}
\begin{center}

%Espacio antes del logo del itba
\Large \  \\[1.5cm]

\includegraphics[scale=0.40]{Imagenes/logo_itba}\\[1cm]
\textsc{\LARGE Sistemas de inteligencia artificial}\\[1.5cm]
\textsc{\Large Informe preliminar $\text{n}^{\circ}$2}\\[0.5cm]

\HRule \\[0.4cm]
{ \huge \bfseries Red neuronal con aprendizaje supervisado}\\[0.4cm]
\HRule \\[1.5cm]

\Large Autores: \\ [0.25cm]
\begin{tabular}{l @{\ \ -\ \ }l}
\Large Pablo Ballesty & \Large 49359\\[0.2cm]
\Large Nicolás Magni & \Large 48008\\[0.2cm]
\Large Guillermo Liss & \Large 49282 \\[0.2cm]
\end{tabular}



\vspace{1cm}

\vfill
% La fecha queda abajo.
{\large \today}

\end{center}
\end{titlepage}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Introducción}

El objetivo del presente documento es detallar el diseño e implementación de una red neuronal utilizando aprendizaje supervisado
para resolver las operaciones lógicas AND y OR para $N$ bits con $2 \le N \le 5$.

\section{Desarrollo}

\subsection{Decisiones de implementación}
Para ambos problemas se decidió utilizar un perceptrón simple con 6 neuronas en su capa de entrada, y 1 neurona en su capa de salida.\\
Para la ejecución de uno de los métodos el usuario deberá especificar 3 datos los cuales definimos de la siguiente forma:
\begin{itemize}
 \item \textbf{method} Método a ejecutar \textit{AND} u \textit{OR}.
 \item \textbf{uInput} Vector de tamaño $N$ con $2 \le N \le 5$, con valores 0 o 1.
 \item \textbf{tfunction} Función de transferencia \textit{``step''}, \textit{``sigmoid''} o \textit{``lineal''}.
\end{itemize}
Una vez ingresados estos datos, se normaliza \textit{uInput} agregando un -1 en el primer lugar para el \textit{``bias''},
se convierten los 0 a -1 y en caso que el tamaño de \textit{uInput} sea menor que 5, se completa ingresando un valor que no
altere el resultado, es decir, para \textit{AND} 1 y para \textit{OR} -1. \\
Por ejemplo si el usuario va a ejecutar \textit{AND} con el vector (1,0), el vector de entrada normalizado será (-1,1-1,1,1,1)

\subsection{Funciones de transferencia}
Se utilizan 3 funciones de transferencia. A continaución se definen las mismas.
\begin{equation}
 \mbox{\textit{step}}(x) = \left\{ \begin{array}{ll}
         1 & \mbox{if $x \geq 0$};\\
        -1 & \mbox{if $x < 0$}.\end{array} \right.
\end{equation}
\begin{equation}
 \mbox{\textit{sigmoid}}(x) = tanh(x)
\end{equation}
\begin{equation}
 \mbox{\textit{lineal}}(x) = x
\end{equation}

\subsection{Entrenamiento}
Para ambos casos el conjunto de patrones de entrenamiento está formado por todas las posibles entradas de longitud 5, es decir 32 entradas distintas,
con el resultado esparado correspondiente para cada caso.
El algoritmo de aprendizaje consta de los siguientes pasos:
\begin{enumerate}
 \item Inicializar los pesos $w_{ik}$ con un valor aleatorio.
 \item Para cada patrón del conjunto de patrones de entrenamiento:
  \begin{itemize}
   \item Se evalúa el patrón en la red, utilizando los pesos actuales.
   \item Si el valor que se obtiene es el esperado se sigue con el próximo patrón.
   \item Si el valor no es el esperado se suma a cada peso $w_{ik}$ el término $\Delta w_{ik} = \eta (S_{i}^{\mu} - o_{i}^{\mu}) \xi_{k}^{\mu}$ en
sentido de Hebb, y se continúa con el próximo patrón.
  \end{itemize}
\end{enumerate}

Para probar si el entrenamiento resulta existoso, se utiliza como conjunto de testeo también todas las posibles combinaciones. Se desarrolló la función
\textit{testNet.m} que arroja la cantidad de respuetas correctas que arroja la red.\\
Para averiguar la cantidad de épocas necesarias de entrenamiento de la red, se desarrolló la función \textit{trainingTimes.m} que va incrementando la cantidad
de épocas a correr, y por cada época realiza 100 entrenamientos, la función devuelve la cantidad de épocas en la cual los 100 entrenamientos arrojan las 
respuestas correctas para el conjunto de testeo.

\section{Resultados}
Utilizando \textit{trainingTimes.m} se obtuvierons los siguientes resultados:
\begin{itemize}
 \item \textbf{AND:} \textit{step:} 3 épocas, \textit{sigmoid:} 2 épocas, \textit{lineal:} 2 épocas.
 \item \textbf{OR: } \textit{step:} 16 épocas, \textit{sigmoid:} 10 épocas, \textit{lineal:} 11 épocas.

\end{itemize}

\section{Conclusiones}
Se pudo notar que el OR precisó de más épocas para lograr un aprendizaje satisfactorio que el AND. Esto era de esperar, ya que en cada
paso las correcciones se realizan sobre las conexiónes que unen una entrada y salida con valores distintos, en el caso del AND suelen diferir
varias entradas, mientras que en con el OR son pocas.
\end{document}